bbe0d87f8f674835d71ae25816c4278a7b4785b3,hbase-server/src/main/java/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.java,AggregationClient,max,#number[]#ColumnInterpreter#Scan#,95

Before Change


  public <R, S> R max(final byte[] tableName, final ColumnInterpreter<R, S> ci,
      final Scan scan) throws Throwable {
    validateParameters(scan);
    HTable table = new HTable(conf, tableName);

    class MaxCallBack implements Batch.Callback<R> {
      R max = null;

      R getMax() {
        return max;
      }

      @Override
      public synchronized void update(byte[] region, byte[] row, R result) {
        max = (max == null || (result != null && ci.compare(max, result) < 0)) ? result : max;
      }
    }
    MaxCallBack aMaxCallBack = new MaxCallBack();
    table.coprocessorExec(AggregateProtocol.class, scan.getStartRow(), scan
        .getStopRow(), new Batch.Call<AggregateProtocol, R>() {
      @Override
      public R call(AggregateProtocol instance) throws IOException {
        return instance.getMax(ci, scan);
      }
    }, aMaxCallBack);
    return aMaxCallBack.getMax();
  }

After Change


    MaxCallBack aMaxCallBack = new MaxCallBack();
    HTable table = null;
    try {
      table = new HTable(conf, tableName);
      table.coprocessorExec(AggregateProtocol.class, scan.getStartRow(),
          scan.getStopRow(), new Batch.Call<AggregateProtocol, R>() {
            @Override
            public R call(AggregateProtocol instance) throws IOException {
              return instance.getMax(ci, scan);
            }
          }, aMaxCallBack);
    } finally {
      if (table != null) {
        table.close();